/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.evangelion.core.controller;

/**
 *
 * @author Kellycasma
 */
import com.evangelion.core.bean.Cliente;
import com.evangelion.core.daoImpl.ConnectionUtil;
import com.evangelion.core.daoImpl.GenericDaoImpl;
import java.io.File;
import java.io.Serializable;
import java.sql.Connection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
 
@ManagedBean(name = "relatorioPedidosClienteController")
@ViewScoped
public class RelatorioPedidosClienteController {
 
    private TimeZone timeZone = TimeZone.getDefault();
    private JasperPrint impressao;
    private HashMap<String, Serializable> parametroMap;
    private FacesContext context;
    private ServletContext servletContext;
    private String mensagem, caminhoRelatorio;
    private Date dataInicio, dataFim;
    private boolean exibeDialog, exibeTabelaCliente;
    private Cliente cliente;
    private List<Cliente> listaClientes;
    private GenericDaoImpl gd;
 
    @PostConstruct
    public void init() {
        // Chamando ao instanciar o escopo de visao 
        cliente = new Cliente();
    }
 
    @PreDestroy
    public void destroy() {
        // A chamada eh realizada quando a pagina eh alterada 
    }
 
    public String getMensagem() {
        return mensagem;
    }
 
    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }
 
    public boolean isExibeDialog() {
        return exibeDialog;
    }
 
    public void setExibeDialog(boolean exibeDialog) {
        this.exibeDialog = exibeDialog;
    }
 
    public boolean isExibeTabelaCliente() {
        return exibeTabelaCliente;
    }
 
    public void setExibeTabelaCliente(boolean exibeTabelaCliente) {
        this.exibeTabelaCliente = exibeTabelaCliente;
    }
 
    public Date getDataInicio() {
        return dataInicio;
    }
 
    public void setDataInicio(Date dataInicio) {
        this.dataInicio = dataInicio;
    }
 
    public Date getDataFim() {
        return dataFim;
    }
 
    public void setDataFim(Date dataFim) {
        this.dataFim = dataFim;
    }
 
    public TimeZone getTimeZone() {
        return timeZone;
    }
 
    public Cliente getCliente() {
        return cliente;
    }
 
    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }
 
    public List<Cliente> getListaClientes() {
        return listaClientes;
    }
 
    public void setListaClientes(List<Cliente> listaClientes) {
        this.listaClientes = listaClientes;
    }
 
    public void carregaClientesPeloNome() {
        setListaClientes(gd.ListActive(cliente));
    }
 
    public String montaSQL(Integer idCliente, String dataInicio, String dataFim) {
        String sql = " 1 = 1";
 
        if (!dataInicio.isEmpty() && !dataFim.isEmpty()) {
            sql += " AND ( ped.DATA_EMISSAO BETWEEN STR_TO_DATE('" + dataInicio + "', '%d/%m/%Y') AND STR_TO_DATE('" + dataFim + "', '%d/%m/%Y') )";
        }
 
        if (idCliente != null) {
            sql += " AND cli.ID_CLIENTE = '" + idCliente + "'";
        }
 
        sql += " GROUP BY cli.ID_CLIENTE, ped.ID_PEDIDO, prod.ID_PRODUTO, pp.ID_PED_PROD";
 
        return sql;
    }
 
    public void geraRelatorio() {
        mensagem += "Caminho do relatório: ";
 
        
        setExibeDialog(true);
        enviarPdf();
    }
 
    public void enviarPdf() {
        // Carrega o xml de definição do relatório
        try {
            HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
            // Configura o response para suportar o relatório
            response.setContentType("application/pdf");
            // response.addHeader("Content-disposition", "inline; filename=\"arquivo.pdf\"");
            response.addHeader("Content-disposition", "attachment; filename=\"arquivo.pdf\"");
 
            // Preenche o relatório com os parametros e o data source
            String archivo = "reporteFacturaLote.jasper";
        Map parameters = new HashMap();
        parameters.put("fechaI", new Date());
        parameters.put("fechaF", new Date());
            Connection conexion = ConnectionUtil.getConnection();
            String urlMaster = ConnectionUtil.getServletContext().getRealPath(File.separator + "general" + File.separator + "reportes" + File.separator + archivo);
            JasperReport reporteMaster = null;
            try {
                reporteMaster = (JasperReport) JRLoader.loadObject(urlMaster);
            } catch (Exception e) {
                e.printStackTrace();
            }
            JasperPrint impressao = null;
            impressao = JasperFillManager.fillReport(reporteMaster, parameters, conexion);
            // Exporta o relatório
            JasperExportManager.exportReportToPdfStream(impressao, response.getOutputStream());
            // Salva o estado da aplicação no contexto do JSF
            context.getApplication().getStateManager().saveView(context);
            // Fecha o stream do response
            context.responseComplete();
        } catch (Exception e) {
            setExibeDialog(true);
            mensagem += e;
        }
    }
}